package cn.kickegg.design.single;

/**
 * @author KickEGG
 * @createTime 2018-08-02 21:42
 * @Description 单例设计模式-懒汉模式-加强
 */
public class LazySingleInstance {

  // 私有化静态成员变量，防止外界修改，没有实例化
  private static LazySingleInstance lazySingleInstance = null;

  private static boolean flag = false;

  // 私有化构造方法，防止外界调用，保证对象是单例对象
  private LazySingleInstance() {
    synchronized(LazySingleInstance.class)
    {
      if(flag == false)
      {
        flag = !flag;
      }
      else
      {
        throw new RuntimeException("单例模式不可以被再实例化");
      }
    }
  }

  // 提供一个公共的接口供外界获得单例对象
  // 当多个线程都在调用此方法时，必须保证只有一个单例对象生成，
  // 这里采用对同步代码块加上
  // 因为成员变量是静态的，该方法也必须是静态方法
  public static LazySingleInstance getInstance() {
    if (lazySingleInstance == null) {
      // 静态方法，使用当前类本身作为锁
      synchronized (LazySingleInstance.class) {
        lazySingleInstance = new LazySingleInstance();
      }
    }
    return lazySingleInstance;
  }
}
